if ( likely(domid == DOMID_SELF) )
{
- pg_owner = rcu_lock_domain(curr);
+ pg_owner = rcu_lock_current_domain();
goto out;
}
if ( !map )
return -EINVAL;
- if ( map->domid == DOMID_SELF )
- d = rcu_lock_domain(current->domain);
- else
- d = rcu_lock_domain_by_id(map->domid);
+ d = (map->domid == DOMID_SELF) ? rcu_lock_current_domain()
+ : rcu_lock_domain_by_id(map->domid);
if ( d == NULL )
return -ESRCH;
struct domain *d;
int ret;
- if ( unmap->domid == DOMID_SELF )
- d = rcu_lock_domain(current->domain);
- else
- d = rcu_lock_domain_by_id(unmap->domid);
+ d = (unmap->domid == DOMID_SELF) ? rcu_lock_current_domain()
+ : rcu_lock_domain_by_id(unmap->domid);
if ( d == NULL )
return -ESRCH;
struct domain *rcu_lock_domain_by_id(domid_t dom)
{
- struct domain *d;
+ struct domain *d = NULL;
rcu_read_lock(&domlist_read_lock);
d = rcu_dereference(d->next_in_hashbucket) )
{
if ( d->domain_id == dom )
- return d;
+ {
+ rcu_lock_domain(d);
+ break;
+ }
}
rcu_read_unlock(&domlist_read_lock);
- return NULL;
+ return d;
}
int rcu_lock_target_domain_by_id(domid_t dom, struct domain **d)
/* Finish a RCU critical region started by rcu_lock_domain_by_id(). */
static inline void rcu_unlock_domain(struct domain *d)
{
- rcu_read_unlock(&domlist_read_lock);
+ if ( d != current->domain )
+ rcu_read_unlock(&domlist_read_lock);
}
static inline struct domain *rcu_lock_domain(struct domain *d)
{
- rcu_read_lock(d);
+ if ( d != current->domain )
+ rcu_read_lock(d);
return d;
}
static inline struct domain *rcu_lock_current_domain(void)
{
- return rcu_lock_domain(current->domain);
+ return /*rcu_lock_domain*/(current->domain);
}
struct domain *get_domain_by_id(domid_t dom);